package thread;

/**
 * wait/notify方法的测试。
 */
public class WaitTest {
    Object lock = new Object();

    /**
     * wait/notify/notifyAll：只能是，获取了锁的线程才能调用，【换句话说：只能是在synchronized中调用，否则会报错】
     *      这是因为：这三种方法都是操作【Monitor中的【Owner】、【WaitSet】、【EntryList】】的，这三个集合，只有【Owner中的线程】才能操作。
     *      【必须获得此对象的锁，才能调用这几个方法】。
     */
    private void test1(){
        Object o =new Object();
        //当前线程没有获取锁会报错。【IllegalMonitorStateException】。
        o.notify();

        //获取锁。
        synchronized (o){
            //才能调用。
            o.notify();
        }

    }


    /**
     * wait与notify的使用。
     */
    private void test2() throws InterruptedException {
        Thread t1 = new Thread("t1"){
            @Override
            public void run() {
                //另一个线程
                synchronized(lock) {
                    lock.notifyAll();
                }
            }
        };
        t1.start();

        synchronized(lock) {
            while(true) {
                lock.wait();
            }
            // 干活
        }
    }



}
